#include "SW_CRC.h"


#if ( SW_CRC8_ENABLE || SW_CRC8_ITU_ENABLE )

const uint8_t g_u8SWCRC8_OR_ITU_Table[] = 
{
0x00U,0x07U,0x0EU,0x09U,0x1CU,0x1BU,0x12U,0x15U,0x38U,0x3FU,0x36U,0x31U,0x24U,0x23U,0x2AU,0x2DU,
0x70U,0x77U,0x7EU,0x79U,0x6CU,0x6BU,0x62U,0x65U,0x48U,0x4FU,0x46U,0x41U,0x54U,0x53U,0x5AU,0x5DU,
0xE0U,0xE7U,0xEEU,0xE9U,0xFCU,0xFBU,0xF2U,0xF5U,0xD8U,0xDFU,0xD6U,0xD1U,0xC4U,0xC3U,0xCAU,0xCDU,
0x90U,0x97U,0x9EU,0x99U,0x8CU,0x8BU,0x82U,0x85U,0xA8U,0xAFU,0xA6U,0xA1U,0xB4U,0xB3U,0xBAU,0xBDU,
0xC7U,0xC0U,0xC9U,0xCEU,0xDBU,0xDCU,0xD5U,0xD2U,0xFFU,0xF8U,0xF1U,0xF6U,0xE3U,0xE4U,0xEDU,0xEAU,
0xB7U,0xB0U,0xB9U,0xBEU,0xABU,0xACU,0xA5U,0xA2U,0x8FU,0x88U,0x81U,0x86U,0x93U,0x94U,0x9DU,0x9AU,
0x27U,0x20U,0x29U,0x2EU,0x3BU,0x3CU,0x35U,0x32U,0x1FU,0x18U,0x11U,0x16U,0x03U,0x04U,0x0DU,0x0AU,
0x57U,0x50U,0x59U,0x5EU,0x4BU,0x4CU,0x45U,0x42U,0x6FU,0x68U,0x61U,0x66U,0x73U,0x74U,0x7DU,0x7AU,
0x89U,0x8EU,0x87U,0x80U,0x95U,0x92U,0x9BU,0x9CU,0xB1U,0xB6U,0xBFU,0xB8U,0xADU,0xAAU,0xA3U,0xA4U,
0xF9U,0xFEU,0xF7U,0xF0U,0xE5U,0xE2U,0xEBU,0xECU,0xC1U,0xC6U,0xCFU,0xC8U,0xDDU,0xDAU,0xD3U,0xD4U,
0x69U,0x6EU,0x67U,0x60U,0x75U,0x72U,0x7BU,0x7CU,0x51U,0x56U,0x5FU,0x58U,0x4DU,0x4AU,0x43U,0x44U,
0x19U,0x1EU,0x17U,0x10U,0x05U,0x02U,0x0BU,0x0CU,0x21U,0x26U,0x2FU,0x28U,0x3DU,0x3AU,0x33U,0x34U,
0x4EU,0x49U,0x40U,0x47U,0x52U,0x55U,0x5CU,0x5BU,0x76U,0x71U,0x78U,0x7FU,0x6AU,0x6DU,0x64U,0x63U,
0x3EU,0x39U,0x30U,0x37U,0x22U,0x25U,0x2CU,0x2BU,0x06U,0x01U,0x08U,0x0FU,0x1AU,0x1DU,0x14U,0x13U,
0xAEU,0xA9U,0xA0U,0xA7U,0xB2U,0xB5U,0xBCU,0xBBU,0x96U,0x91U,0x98U,0x9FU,0x8AU,0x8DU,0x84U,0x83U,
0xDEU,0xD9U,0xD0U,0xD7U,0xC2U,0xC5U,0xCCU,0xCBU,0xE6U,0xE1U,0xE8U,0xEFU,0xFAU,0xFDU,0xF4U,0xF3U,
};/** 数据表相同 */

#endif

#if SW_CRC8_ENABLE

const SW_CRC8_st_t g_stSWCRC8 = 
{
    /* pu8Table  = */ g_u8SWCRC8_OR_ITU_Table,
    /* u8InitVal = */ 0x00U,
    /* u8RefIn   = */ CRC_FALSE,
    /* u8RefOut  = */ CRC_FALSE,
    /* u8XorOut  = */ 0x00U,
};

#endif

#if SW_CRC8_ITU_ENABLE

const SW_CRC8_st_t g_stSWCRC8_ITU = 
{
    g_u8SWCRC8_OR_ITU_Table,    
    0x00U,
    CRC_FALSE,
    CRC_FALSE,
    0x55U,
};

#endif

#if SW_CRC8_ROHC_ENABLE

const uint8_t CRC8_ROHC_Table[] = {
0x00,0x91,0xE3,0x72,0x07,0x96,0xE4,0x75,0x0E,0x9F,0xED,0x7C,0x09,0x98,0xEA,0x7B,
0x1C,0x8D,0xFF,0x6E,0x1B,0x8A,0xF8,0x69,0x12,0x83,0xF1,0x60,0x15,0x84,0xF6,0x67,
0x38,0xA9,0xDB,0x4A,0x3F,0xAE,0xDC,0x4D,0x36,0xA7,0xD5,0x44,0x31,0xA0,0xD2,0x43,
0x24,0xB5,0xC7,0x56,0x23,0xB2,0xC0,0x51,0x2A,0xBB,0xC9,0x58,0x2D,0xBC,0xCE,0x5F,
0x70,0xE1,0x93,0x02,0x77,0xE6,0x94,0x05,0x7E,0xEF,0x9D,0x0C,0x79,0xE8,0x9A,0x0B,
0x6C,0xFD,0x8F,0x1E,0x6B,0xFA,0x88,0x19,0x62,0xF3,0x81,0x10,0x65,0xF4,0x86,0x17,
0x48,0xD9,0xAB,0x3A,0x4F,0xDE,0xAC,0x3D,0x46,0xD7,0xA5,0x34,0x41,0xD0,0xA2,0x33,
0x54,0xC5,0xB7,0x26,0x53,0xC2,0xB0,0x21,0x5A,0xCB,0xB9,0x28,0x5D,0xCC,0xBE,0x2F,
0xE0,0x71,0x03,0x92,0xE7,0x76,0x04,0x95,0xEE,0x7F,0x0D,0x9C,0xE9,0x78,0x0A,0x9B,
0xFC,0x6D,0x1F,0x8E,0xFB,0x6A,0x18,0x89,0xF2,0x63,0x11,0x80,0xF5,0x64,0x16,0x87,
0xD8,0x49,0x3B,0xAA,0xDF,0x4E,0x3C,0xAD,0xD6,0x47,0x35,0xA4,0xD1,0x40,0x32,0xA3,
0xC4,0x55,0x27,0xB6,0xC3,0x52,0x20,0xB1,0xCA,0x5B,0x29,0xB8,0xCD,0x5C,0x2E,0xBF,
0x90,0x01,0x73,0xE2,0x97,0x06,0x74,0xE5,0x9E,0x0F,0x7D,0xEC,0x99,0x08,0x7A,0xEB,
0x8C,0x1D,0x6F,0xFE,0x8B,0x1A,0x68,0xF9,0x82,0x13,0x61,0xF0,0x85,0x14,0x66,0xF7,
0xA8,0x39,0x4B,0xDA,0xAF,0x3E,0x4C,0xDD,0xA6,0x37,0x45,0xD4,0xA1,0x30,0x42,0xD3,
0xB4,0x25,0x57,0xC6,0xB3,0x22,0x50,0xC1,0xBA,0x2B,0x59,0xC8,0xBD,0x2C,0x5E,0xCF,
};

const SW_CRC8_st_t g_stSWCRC8_ROHC = 
{
    CRC8_ROHC_Table,    
    0xFFU,
    CRC_TRUE,
    CRC_TRUE,
    0x00U,
};

#endif

#if SW_CRC8_MAXIM_ENABLE

const uint8_t CRC8_MAXIM_Table[] = {
0x00,0x5E,0xBC,0xE2,0x61,0x3F,0xDD,0x83,0xC2,0x9C,0x7E,0x20,0xA3,0xFD,0x1F,0x41,
0x9D,0xC3,0x21,0x7F,0xFC,0xA2,0x40,0x1E,0x5F,0x01,0xE3,0xBD,0x3E,0x60,0x82,0xDC,
0x23,0x7D,0x9F,0xC1,0x42,0x1C,0xFE,0xA0,0xE1,0xBF,0x5D,0x03,0x80,0xDE,0x3C,0x62,
0xBE,0xE0,0x02,0x5C,0xDF,0x81,0x63,0x3D,0x7C,0x22,0xC0,0x9E,0x1D,0x43,0xA1,0xFF,
0x46,0x18,0xFA,0xA4,0x27,0x79,0x9B,0xC5,0x84,0xDA,0x38,0x66,0xE5,0xBB,0x59,0x07,
0xDB,0x85,0x67,0x39,0xBA,0xE4,0x06,0x58,0x19,0x47,0xA5,0xFB,0x78,0x26,0xC4,0x9A,
0x65,0x3B,0xD9,0x87,0x04,0x5A,0xB8,0xE6,0xA7,0xF9,0x1B,0x45,0xC6,0x98,0x7A,0x24,
0xF8,0xA6,0x44,0x1A,0x99,0xC7,0x25,0x7B,0x3A,0x64,0x86,0xD8,0x5B,0x05,0xE7,0xB9,
0x8C,0xD2,0x30,0x6E,0xED,0xB3,0x51,0x0F,0x4E,0x10,0xF2,0xAC,0x2F,0x71,0x93,0xCD,
0x11,0x4F,0xAD,0xF3,0x70,0x2E,0xCC,0x92,0xD3,0x8D,0x6F,0x31,0xB2,0xEC,0x0E,0x50,
0xAF,0xF1,0x13,0x4D,0xCE,0x90,0x72,0x2C,0x6D,0x33,0xD1,0x8F,0x0C,0x52,0xB0,0xEE,
0x32,0x6C,0x8E,0xD0,0x53,0x0D,0xEF,0xB1,0xF0,0xAE,0x4C,0x12,0x91,0xCF,0x2D,0x73,
0xCA,0x94,0x76,0x28,0xAB,0xF5,0x17,0x49,0x08,0x56,0xB4,0xEA,0x69,0x37,0xD5,0x8B,
0x57,0x09,0xEB,0xB5,0x36,0x68,0x8A,0xD4,0x95,0xCB,0x29,0x77,0xF4,0xAA,0x48,0x16,
0xE9,0xB7,0x55,0x0B,0x88,0xD6,0x34,0x6A,0x2B,0x75,0x97,0xC9,0x4A,0x14,0xF6,0xA8,
0x74,0x2A,0xC8,0x96,0x15,0x4B,0xA9,0xF7,0xB6,0xE8,0x0A,0x54,0xD7,0x89,0x6B,0x35,
};

const SW_CRC8_st_t g_stSWCRC8_MAXIM = 
{
    CRC8_MAXIM_Table,    
    0x00U,
    CRC_TRUE,
    CRC_TRUE,
    0x00U,
};

#endif


#if (SW_CRC16_IBM_ENABLE || SW_CRC16_MAXIM_ENABLE || SW_CRC16_USB_ENABLE || SW_CRC16_MODBUS_ENABLE)

const uint16_t CRC16_Common_Table[] = {
0x00,0xC0C1,0xC181,0x140,0xC301,0x3C0,0x280,0xC241,0xC601,0x6C0,0x780,0xC741,0x500,0xC5C1,0xC481,0x440,
0xCC01,0xCC0,0xD80,0xCD41,0xF00,0xCFC1,0xCE81,0xE40,0xA00,0xCAC1,0xCB81,0xB40,0xC901,0x9C0,0x880,0xC841,
0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,
0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,
0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,
0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,
0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,
0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,
0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,
0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,
0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,
0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,
0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,
0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,
0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,
0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040,
};

#endif

#if SW_CRC16_IBM_ENABLE

const SW_CRC16_st_t g_stSWCRC16_IBM = 
{
    CRC16_Common_Table,    
    0x0000U,
    CRC_TRUE,
    CRC_TRUE,
    0x0000U,
};

#endif


#if SW_CRC16_MAXIM_ENABLE

const SW_CRC16_st_t g_stSWCRC16_MAXIM = 
{
    CRC16_Common_Table,    
    0x0000U,
    CRC_TRUE,
    CRC_TRUE,
    0xFFFFU,
};

#endif


#if SW_CRC16_USB_ENABLE

const SW_CRC16_st_t g_stSWCRC16_USB = 
{
    CRC16_Common_Table,    
    0xFFFFU,
    CRC_TRUE,
    CRC_TRUE,
    0xFFFFU,
};

#endif


#if SW_CRC16_MODBUS_ENABLE

const SW_CRC16_st_t g_stSWCRC16_MODBUS = 
{
    CRC16_Common_Table,    
    0xFFFFU,
    CRC_TRUE,
    CRC_TRUE,
    0x0000U,
};

#endif


#if (SW_CRC16_CCITT_ENABLE || SW_CRC16_X25_ENABLE)

const uint16_t CRC16_CCITT_OR_X25_Table[] = {
0x00,0x1189,0x2312,0x329B,0x4624,0x57AD,0x6536,0x74BF,0x8C48,0x9DC1,0xAF5A,0xBED3,0xCA6C,0xDBE5,0xE97E,0xF8F7,
0x1081,0x108,0x3393,0x221A,0x56A5,0x472C,0x75B7,0x643E,0x9CC9,0x8D40,0xBFDB,0xAE52,0xDAED,0xCB64,0xF9FF,0xE876,
0x2102,0x308B,0x210,0x1399,0x6726,0x76AF,0x4434,0x55BD,0xAD4A,0xBCC3,0x8E58,0x9FD1,0xEB6E,0xFAE7,0xC87C,0xD9F5,
0x3183,0x200A,0x1291,0x318,0x77A7,0x662E,0x54B5,0x453C,0xBDCB,0xAC42,0x9ED9,0x8F50,0xFBEF,0xEA66,0xD8FD,0xC974,
0x4204,0x538D,0x6116,0x709F,0x420,0x15A9,0x2732,0x36BB,0xCE4C,0xDFC5,0xED5E,0xFCD7,0x8868,0x99E1,0xAB7A,0xBAF3,
0x5285,0x430C,0x7197,0x601E,0x14A1,0x528,0x37B3,0x263A,0xDECD,0xCF44,0xFDDF,0xEC56,0x98E9,0x8960,0xBBFB,0xAA72,
0x6306,0x728F,0x4014,0x519D,0x2522,0x34AB,0x630,0x17B9,0xEF4E,0xFEC7,0xCC5C,0xDDD5,0xA96A,0xB8E3,0x8A78,0x9BF1,
0x7387,0x620E,0x5095,0x411C,0x35A3,0x242A,0x16B1,0x738,0xFFCF,0xEE46,0xDCDD,0xCD54,0xB9EB,0xA862,0x9AF9,0x8B70,
0x8408,0x9581,0xA71A,0xB693,0xC22C,0xD3A5,0xE13E,0xF0B7,0x840,0x19C9,0x2B52,0x3ADB,0x4E64,0x5FED,0x6D76,0x7CFF,
0x9489,0x8500,0xB79B,0xA612,0xD2AD,0xC324,0xF1BF,0xE036,0x18C1,0x948,0x3BD3,0x2A5A,0x5EE5,0x4F6C,0x7DF7,0x6C7E,
0xA50A,0xB483,0x8618,0x9791,0xE32E,0xF2A7,0xC03C,0xD1B5,0x2942,0x38CB,0xA50,0x1BD9,0x6F66,0x7EEF,0x4C74,0x5DFD,
0xB58B,0xA402,0x9699,0x8710,0xF3AF,0xE226,0xD0BD,0xC134,0x39C3,0x284A,0x1AD1,0xB58,0x7FE7,0x6E6E,0x5CF5,0x4D7C,
0xC60C,0xD785,0xE51E,0xF497,0x8028,0x91A1,0xA33A,0xB2B3,0x4A44,0x5BCD,0x6956,0x78DF,0xC60,0x1DE9,0x2F72,0x3EFB,
0xD68D,0xC704,0xF59F,0xE416,0x90A9,0x8120,0xB3BB,0xA232,0x5AC5,0x4B4C,0x79D7,0x685E,0x1CE1,0xD68,0x3FF3,0x2E7A,
0xE70E,0xF687,0xC41C,0xD595,0xA12A,0xB0A3,0x8238,0x93B1,0x6B46,0x7ACF,0x4854,0x59DD,0x2D62,0x3CEB,0xE70,0x1FF9,
0xF78F,0xE606,0xD49D,0xC514,0xB1AB,0xA022,0x92B9,0x8330,0x7BC7,0x6A4E,0x58D5,0x495C,0x3DE3,0x2C6A,0x1EF1,0xF78,
};

#endif

#if SW_CRC16_CCITT_ENABLE

const SW_CRC16_st_t g_stSWCRC16_CCITT = 
{
    CRC16_CCITT_OR_X25_Table,    
    0x0000U,
    CRC_TRUE,
    CRC_TRUE,
    0x0000U,
};

#endif


#if SW_CRC16_X25_ENABLE

const SW_CRC16_st_t g_stSWCRC16_X25 = 
{
    CRC16_CCITT_OR_X25_Table,    
    0xFFFFU,
    CRC_TRUE,
    CRC_TRUE,
    0xFFFFU,
};

#endif



#if (SW_CRC16_CCITT_FALSE_ENABLE || SW_CRC16_XMODEM_ENABLE)

const uint16_t CRC16_CCITT_FALSE_OR_XMODEM_Table[] = {
0x00,0x1021,0x2042,0x3063,0x4084,0x50A5,0x60C6,0x70E7,0x8108,0x9129,0xA14A,0xB16B,0xC18C,0xD1AD,0xE1CE,0xF1EF,
0x1231,0x210,0x3273,0x2252,0x52B5,0x4294,0x72F7,0x62D6,0x9339,0x8318,0xB37B,0xA35A,0xD3BD,0xC39C,0xF3FF,0xE3DE,
0x2462,0x3443,0x420,0x1401,0x64E6,0x74C7,0x44A4,0x5485,0xA56A,0xB54B,0x8528,0x9509,0xE5EE,0xF5CF,0xC5AC,0xD58D,
0x3653,0x2672,0x1611,0x630,0x76D7,0x66F6,0x5695,0x46B4,0xB75B,0xA77A,0x9719,0x8738,0xF7DF,0xE7FE,0xD79D,0xC7BC,
0x48C4,0x58E5,0x6886,0x78A7,0x840,0x1861,0x2802,0x3823,0xC9CC,0xD9ED,0xE98E,0xF9AF,0x8948,0x9969,0xA90A,0xB92B,
0x5AF5,0x4AD4,0x7AB7,0x6A96,0x1A71,0xA50,0x3A33,0x2A12,0xDBFD,0xCBDC,0xFBBF,0xEB9E,0x9B79,0x8B58,0xBB3B,0xAB1A,
0x6CA6,0x7C87,0x4CE4,0x5CC5,0x2C22,0x3C03,0xC60,0x1C41,0xEDAE,0xFD8F,0xCDEC,0xDDCD,0xAD2A,0xBD0B,0x8D68,0x9D49,
0x7E97,0x6EB6,0x5ED5,0x4EF4,0x3E13,0x2E32,0x1E51,0xE70,0xFF9F,0xEFBE,0xDFDD,0xCFFC,0xBF1B,0xAF3A,0x9F59,0x8F78,
0x9188,0x81A9,0xB1CA,0xA1EB,0xD10C,0xC12D,0xF14E,0xE16F,0x1080,0xA1,0x30C2,0x20E3,0x5004,0x4025,0x7046,0x6067,
0x83B9,0x9398,0xA3FB,0xB3DA,0xC33D,0xD31C,0xE37F,0xF35E,0x2B1,0x1290,0x22F3,0x32D2,0x4235,0x5214,0x6277,0x7256,
0xB5EA,0xA5CB,0x95A8,0x8589,0xF56E,0xE54F,0xD52C,0xC50D,0x34E2,0x24C3,0x14A0,0x481,0x7466,0x6447,0x5424,0x4405,
0xA7DB,0xB7FA,0x8799,0x97B8,0xE75F,0xF77E,0xC71D,0xD73C,0x26D3,0x36F2,0x691,0x16B0,0x6657,0x7676,0x4615,0x5634,
0xD94C,0xC96D,0xF90E,0xE92F,0x99C8,0x89E9,0xB98A,0xA9AB,0x5844,0x4865,0x7806,0x6827,0x18C0,0x8E1,0x3882,0x28A3,
0xCB7D,0xDB5C,0xEB3F,0xFB1E,0x8BF9,0x9BD8,0xABBB,0xBB9A,0x4A75,0x5A54,0x6A37,0x7A16,0xAF1,0x1AD0,0x2AB3,0x3A92,
0xFD2E,0xED0F,0xDD6C,0xCD4D,0xBDAA,0xAD8B,0x9DE8,0x8DC9,0x7C26,0x6C07,0x5C64,0x4C45,0x3CA2,0x2C83,0x1CE0,0xCC1,
0xEF1F,0xFF3E,0xCF5D,0xDF7C,0xAF9B,0xBFBA,0x8FD9,0x9FF8,0x6E17,0x7E36,0x4E55,0x5E74,0x2E93,0x3EB2,0xED1,0x1EF0,
};

#endif

#if SW_CRC16_CCITT_FALSE_ENABLE

const SW_CRC16_st_t g_stSWCRC16_CCITT_FALSE = 
{
    CRC16_CCITT_FALSE_OR_XMODEM_Table,    
    0xFFFFU,
    CRC_FALSE,
    CRC_FALSE,
    0x0000U,
};

#endif


#if SW_CRC16_XMODEM_ENABLE

const SW_CRC16_st_t g_stSWCRC16_XMODEM = 
{
    CRC16_CCITT_FALSE_OR_XMODEM_Table,    
    0x0000U,
    CRC_FALSE,
    CRC_FALSE,
    0x0000U,
};

#endif


#if SW_CRC16_DNP_ENABLE

const uint16_t CRC16_DNP_Table[] = {
0x00,0x365E,0x6CBC,0x5AE2,0xD978,0xEF26,0xB5C4,0x839A,0xFF89,0xC9D7,0x9335,0xA56B,0x26F1,0x10AF,0x4A4D,0x7C13,
0xB26B,0x8435,0xDED7,0xE889,0x6B13,0x5D4D,0x7AF,0x31F1,0x4DE2,0x7BBC,0x215E,0x1700,0x949A,0xA2C4,0xF826,0xCE78,
0x29AF,0x1FF1,0x4513,0x734D,0xF0D7,0xC689,0x9C6B,0xAA35,0xD626,0xE078,0xBA9A,0x8CC4,0xF5E,0x3900,0x63E2,0x55BC,
0x9BC4,0xAD9A,0xF778,0xC126,0x42BC,0x74E2,0x2E00,0x185E,0x644D,0x5213,0x8F1,0x3EAF,0xBD35,0x8B6B,0xD189,0xE7D7,
0x535E,0x6500,0x3FE2,0x9BC,0x8A26,0xBC78,0xE69A,0xD0C4,0xACD7,0x9A89,0xC06B,0xF635,0x75AF,0x43F1,0x1913,0x2F4D,
0xE135,0xD76B,0x8D89,0xBBD7,0x384D,0xE13,0x54F1,0x62AF,0x1EBC,0x28E2,0x7200,0x445E,0xC7C4,0xF19A,0xAB78,0x9D26,
0x7AF1,0x4CAF,0x164D,0x2013,0xA389,0x95D7,0xCF35,0xF96B,0x8578,0xB326,0xE9C4,0xDF9A,0x5C00,0x6A5E,0x30BC,0x6E2,
0xC89A,0xFEC4,0xA426,0x9278,0x11E2,0x27BC,0x7D5E,0x4B00,0x3713,0x14D,0x5BAF,0x6DF1,0xEE6B,0xD835,0x82D7,0xB489,
0xA6BC,0x90E2,0xCA00,0xFC5E,0x7FC4,0x499A,0x1378,0x2526,0x5935,0x6F6B,0x3589,0x3D7,0x804D,0xB613,0xECF1,0xDAAF,
0x14D7,0x2289,0x786B,0x4E35,0xCDAF,0xFBF1,0xA113,0x974D,0xEB5E,0xDD00,0x87E2,0xB1BC,0x3226,0x478,0x5E9A,0x68C4,
0x8F13,0xB94D,0xE3AF,0xD5F1,0x566B,0x6035,0x3AD7,0xC89,0x709A,0x46C4,0x1C26,0x2A78,0xA9E2,0x9FBC,0xC55E,0xF300,
0x3D78,0xB26,0x51C4,0x679A,0xE400,0xD25E,0x88BC,0xBEE2,0xC2F1,0xF4AF,0xAE4D,0x9813,0x1B89,0x2DD7,0x7735,0x416B,
0xF5E2,0xC3BC,0x995E,0xAF00,0x2C9A,0x1AC4,0x4026,0x7678,0xA6B,0x3C35,0x66D7,0x5089,0xD313,0xE54D,0xBFAF,0x89F1,
0x4789,0x71D7,0x2B35,0x1D6B,0x9EF1,0xA8AF,0xF24D,0xC413,0xB800,0x8E5E,0xD4BC,0xE2E2,0x6178,0x5726,0xDC4,0x3B9A,
0xDC4D,0xEA13,0xB0F1,0x86AF,0x535,0x336B,0x6989,0x5FD7,0x23C4,0x159A,0x4F78,0x7926,0xFABC,0xCCE2,0x9600,0xA05E,
0x6E26,0x5878,0x29A,0x34C4,0xB75E,0x8100,0xDBE2,0xEDBC,0x91AF,0xA7F1,0xFD13,0xCB4D,0x48D7,0x7E89,0x246B,0x1235,
};

const SW_CRC16_st_t g_stSWCRC16_DNP = 
{
    CRC16_DNP_Table,    
    0x0000U,
    CRC_TRUE,
    CRC_TRUE,
    0xFFFFU,
};

#endif


#if SW_CRC32_ENABLE

const uint32_t CRC32_Table[] = {
0x00,0x77073096,0xEE0E612C,0x990951BA,0x76DC419,0x706AF48F,0xE963A535,0x9E6495A3,0xEDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x9B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,
0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,
0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,
0x76DC4190,0x1DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x6B6B51F,0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0xF00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x86D3D2D,0x91646C97,0xE6635C01,
0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,
0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD,
0xEDB88320,0x9ABFB3B6,0x3B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x4DB2615,0x73DC1683,0xE3630B12,0x94643B84,0xD6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0xA00AE27,0x7D079EB1,
0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,
0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79,
0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,
0x9B64C2B0,0xEC63F226,0x756AA39C,0x26D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x5005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,0xCB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0xBDBDF21,
0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D,
};

const SW_CRC32_st_t g_stSWCRC32 = 
{
    CRC32_Table,
    0xFFFFFFFFU,
    CRC_TRUE,
    CRC_TRUE,
    0xFFFFFFFFU,
};

#endif


#if SW_CRC32_MPEG_2_ENABLE

const uint32_t CRC32_MPEG_2_Table[] = {
0x00,0x4C11DB7,0x9823B6E,0xD4326D9,0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD,
0x4C11DB70,0x48D0C6C7,0x4593E01E,0x4152FDA9,0x5F15ADAC,0x5BD4B01B,0x569796C2,0x52568B75,0x6A1936C8,0x6ED82B7F,0x639B0DA6,0x675A1011,0x791D4014,0x7DDC5DA3,0x709F7B7A,0x745E66CD,
0x9823B6E0,0x9CE2AB57,0x91A18D8E,0x95609039,0x8B27C03C,0x8FE6DD8B,0x82A5FB52,0x8664E6E5,0xBE2B5B58,0xBAEA46EF,0xB7A96036,0xB3687D81,0xAD2F2D84,0xA9EE3033,0xA4AD16EA,0xA06C0B5D,
0xD4326D90,0xD0F37027,0xDDB056FE,0xD9714B49,0xC7361B4C,0xC3F706FB,0xCEB42022,0xCA753D95,0xF23A8028,0xF6FB9D9F,0xFBB8BB46,0xFF79A6F1,0xE13EF6F4,0xE5FFEB43,0xE8BCCD9A,0xEC7DD02D,
0x34867077,0x30476DC0,0x3D044B19,0x39C556AE,0x278206AB,0x23431B1C,0x2E003DC5,0x2AC12072,0x128E9DCF,0x164F8078,0x1B0CA6A1,0x1FCDBB16,0x18AEB13,0x54BF6A4,0x808D07D,0xCC9CDCA,
0x7897AB07,0x7C56B6B0,0x71159069,0x75D48DDE,0x6B93DDDB,0x6F52C06C,0x6211E6B5,0x66D0FB02,0x5E9F46BF,0x5A5E5B08,0x571D7DD1,0x53DC6066,0x4D9B3063,0x495A2DD4,0x44190B0D,0x40D816BA,
0xACA5C697,0xA864DB20,0xA527FDF9,0xA1E6E04E,0xBFA1B04B,0xBB60ADFC,0xB6238B25,0xB2E29692,0x8AAD2B2F,0x8E6C3698,0x832F1041,0x87EE0DF6,0x99A95DF3,0x9D684044,0x902B669D,0x94EA7B2A,
0xE0B41DE7,0xE4750050,0xE9362689,0xEDF73B3E,0xF3B06B3B,0xF771768C,0xFA325055,0xFEF34DE2,0xC6BCF05F,0xC27DEDE8,0xCF3ECB31,0xCBFFD686,0xD5B88683,0xD1799B34,0xDC3ABDED,0xD8FBA05A,
0x690CE0EE,0x6DCDFD59,0x608EDB80,0x644FC637,0x7A089632,0x7EC98B85,0x738AAD5C,0x774BB0EB,0x4F040D56,0x4BC510E1,0x46863638,0x42472B8F,0x5C007B8A,0x58C1663D,0x558240E4,0x51435D53,
0x251D3B9E,0x21DC2629,0x2C9F00F0,0x285E1D47,0x36194D42,0x32D850F5,0x3F9B762C,0x3B5A6B9B,0x315D626,0x7D4CB91,0xA97ED48,0xE56F0FF,0x1011A0FA,0x14D0BD4D,0x19939B94,0x1D528623,
0xF12F560E,0xF5EE4BB9,0xF8AD6D60,0xFC6C70D7,0xE22B20D2,0xE6EA3D65,0xEBA91BBC,0xEF68060B,0xD727BBB6,0xD3E6A601,0xDEA580D8,0xDA649D6F,0xC423CD6A,0xC0E2D0DD,0xCDA1F604,0xC960EBB3,
0xBD3E8D7E,0xB9FF90C9,0xB4BCB610,0xB07DABA7,0xAE3AFBA2,0xAAFBE615,0xA7B8C0CC,0xA379DD7B,0x9B3660C6,0x9FF77D71,0x92B45BA8,0x9675461F,0x8832161A,0x8CF30BAD,0x81B02D74,0x857130C3,
0x5D8A9099,0x594B8D2E,0x5408ABF7,0x50C9B640,0x4E8EE645,0x4A4FFBF2,0x470CDD2B,0x43CDC09C,0x7B827D21,0x7F436096,0x7200464F,0x76C15BF8,0x68860BFD,0x6C47164A,0x61043093,0x65C52D24,
0x119B4BE9,0x155A565E,0x18197087,0x1CD86D30,0x29F3D35,0x65E2082,0xB1D065B,0xFDC1BEC,0x3793A651,0x3352BBE6,0x3E119D3F,0x3AD08088,0x2497D08D,0x2056CD3A,0x2D15EBE3,0x29D4F654,
0xC5A92679,0xC1683BCE,0xCC2B1D17,0xC8EA00A0,0xD6AD50A5,0xD26C4D12,0xDF2F6BCB,0xDBEE767C,0xE3A1CBC1,0xE760D676,0xEA23F0AF,0xEEE2ED18,0xF0A5BD1D,0xF464A0AA,0xF9278673,0xFDE69BC4,
0x89B8FD09,0x8D79E0BE,0x803AC667,0x84FBDBD0,0x9ABC8BD5,0x9E7D9662,0x933EB0BB,0x97FFAD0C,0xAFB010B1,0xAB710D06,0xA6322BDF,0xA2F33668,0xBCB4666D,0xB8757BDA,0xB5365D03,0xB1F740B4,
};

const SW_CRC32_st_t g_stSWCRC32_MPEG_2 = 
{
    CRC32_MPEG_2_Table,    
    0xFFFFFFFFU,
    CRC_FALSE,
    CRC_FALSE,
    0x00000000U,
};

#endif

// 位逆转
uint32_t reflected(uint32_t u32input, uint8_t bits)
{
	uint32_t var = 0;
	while (bits--)
	{
		var <<= 1;
		if (u32input & 0x01)
			var |= 1;
		u32input >>= 1;
	}
	return var;
}

void crc_u32table_init(CRC_INFO *info, uint32_t *u32table)
{
	uint32_t u32crc;
	uint32_t i, j;

	for (i = 0; i < 256; i++)		/**遍历 8 位可能的输入值*/ 
	{
		u32crc = i;

		if (info->u8refin)			/**如果需要，对输入值进行比特反转*/
		{
			u32crc = reflected(u32crc, 8);
		}

		u32crc <<= (info->u8width - 8);		/**将 CRC 值左移，以匹配 CRC 宽度*/

		for (j = 0; j < 8; j++)				/**遍历 CRC 宽度中的每一位*/
		{
			if (u32crc & (1U << (info->u8width - 1)))		/**如果 CRC 值最高位为 1*/
			{
				u32crc = (u32crc << 1) ^ info->u32poly;		/**将 CRC 值左移一位并与多项式异或*/
			}
			else
			{
				u32crc <<= 1;		/**将 CRC 值左移一位*/
			}
		}

		if (info->u8refin)		/**输出如果需要反转，对 CRC 值进行比特反转*/
		{
			u32crc = reflected(u32crc, info->u8width);
		}

		u32table[i] = u32crc;
	}
}
